#ifndef QRO_P_H
#define QRO_P_H

#include <set>
#include <tuple>

#include <QByteArray>
#include <QVariant>
#include <QObject>
#include <QMetaMethod>

typedef uint32_t ChannelID;//客户端通道标识
static const ChannelID NullChannel = 0;

typedef uint32_t ObjectID;//对象标识信息
static const ObjectID NullID = 0;

typedef uint32_t InvokeID;//调用标识信息

static const QString ChannelShareName = QStringLiteral("Channel:%1");

//属性更新信息
typedef std::tuple<ObjectID,int> PropertyModifyData;
typedef std::set<PropertyModifyData> PropertyModifyDataSet;

//该对象的创建模式
enum class CreationMode
{
    Dynamic,//动态创建，服务端注册一个实例，客户端创建并注册和链接一个实例
    Static//静态创建，服务端注册一个实例，客户端也注册一个实例后（没有先后关系），二者链接在一起
};

QVariant uncompressVariant(QByteArray bta);
QByteArray compressVariant(QVariant packet);
QVariant invokeMetaMethod(QObject* o,QMetaMethod method,QVariantList param);



//将variant内的指针 引用类型转换为对象id以便传输
QVariant serilizeValue(QVariant value,const std::function<ObjectID(QObject*)>& convertor);
//将variant内的objectid根据目标类型转换
QVariant unserilizeValue(QVariant value,const std::function<QObject*(ObjectID)>& convertor,int targetType);
#endif
